package cn.iocoder.yudao.module.wms.service.person;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.wms.controller.admin.person.vo.PersonPageReqVO;
import cn.iocoder.yudao.module.wms.controller.admin.person.vo.PersonSaveReqVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.person.PersonDO;
import cn.iocoder.yudao.module.wms.dal.mysql.person.PersonMapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import javax.annotation.Resource;
import java.util.*;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.PERSON_CODE_EXISTS;
import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.PERSON_NOT_EXISTS;

/**
 * 业务员档案 Service 实现类
 *
 * @author 孙广伟
 */
@Service
@Validated
public class PersonServiceImpl implements PersonService {

    @Resource
    private PersonMapper personMapper;

    @Override
    public Long createPerson(PersonSaveReqVO createReqVO) {
        // 校验编码存在
        validatePersonCodeExists(createReqVO);
        // 插入
        PersonDO person = BeanUtils.toBean(createReqVO, PersonDO.class);
        personMapper.insert(person);
        // 返回
        return person.getId();
    }

    @Override
    public void updatePerson(PersonSaveReqVO updateReqVO) {
        // 校验存在
        validatePersonExists(updateReqVO.getId());
        // 校验编码存在
        validatePersonCodeExists(updateReqVO);
        // 更新
        PersonDO updateObj = BeanUtils.toBean(updateReqVO, PersonDO.class);
        personMapper.updateById(updateObj);
    }

    @Override
    public void deletePerson(Long id) {
        // 校验存在
        validatePersonExists(id);
        // 删除
        personMapper.deleteById(id);
    }

    private void validatePersonExists(Long id) {
        if (personMapper.selectById(id) == null) {
            throw exception(PERSON_NOT_EXISTS);
        }
    }

    private void validatePersonCodeExists(PersonSaveReqVO reqVO) {
        if (personMapper.selectCountByCode(reqVO) > 0) {
            throw exception(PERSON_CODE_EXISTS);
        }
    }

    @Override
    public PersonDO getPerson(Long id) {
        return personMapper.selectById(id);
    }

    @Override
    public PageResult<PersonDO> getPersonPage(PersonPageReqVO pageReqVO) {
        return personMapper.selectPage(pageReqVO, getCondition(pageReqVO.getDeptId()));
    }

    @Override
    public List<PersonDO> getPersonList() {
        return personMapper.selectList();
    }

    @Override
    public List<PersonDO> getPersonList(PersonDO personDO) {
        return personMapper.getPersonList(personDO);
    }

    /**
     * 去空转换
     * @param deptId 部门id
     * @return 部门id集合
     */
    private Set<Long> getCondition(Long[] deptId) {
        if (deptId == null) {
            return Collections.emptySet();
        }
        return new HashSet<>(Arrays.asList(deptId));
    }

}